using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using APP.QUANLY.Entity;
using APP.QUANLY.DAL;
using APP.QUANLY.Entity.ConditionForm;
using APP.QUANLY.Common;

namespace APP.QUANLY.Provider
{
    public class HOADONXUATKHOCHITIET_Provider
    {
        public IDbConnection dbConnection;
        private string _ErrMsg;
        public string ErrMsg { get { return _ErrMsg; } }
	
        public HOADONXUATKHOCHITIET_Provider()
        {
            dbConnection = StaticVar.ServerConnection;
        }
	
        public HOADONXUATKHOCHITIET_Provider(IDbConnection con)
        {
            dbConnection = con;
        }
		#region Load Table
        /// <summary>
        /// Lấy tất cả HOADONXUATKHOCHITIET trong dữ liệu.
        /// </summary>
        /// <returns></returns>
         public HOADONXUATKHOCHITIETList GetAll()
        {
            HOADONXUATKHOCHITIETList list = null;
            IDbConnection con = dbConnection;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch{ throw new Exception("Không thể kết nối đến cơ sở dữ liệu");}
                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                list = dao.SelectAll();
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return list;
        }
        
        /// <summary>
        /// Tìm HOADONXUATKHOCHITIET dựa theo _MACHITIETHOADON.
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
        public HOADONXUATKHOCHITIET GetBy_MACHITIETHOADON(string MACHITIETHOADON)
        {
            HOADONXUATKHOCHITIET obj = null;
            IDbConnection con = dbConnection;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				obj = GetHOADONXUATKHOCHITIET_NoOpenConnection(con,MACHITIETHOADON);
                if (obj == null) { throw new Exception("HOADONXUATKHOCHITIET không tồn tại"); }
				else obj.IsExisting = true;
            }
            catch (Exception ex)
            {
                obj = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return obj;
        }

		/// <summary>
        /// Lấy HOADONXUATKHOCHITIET dựa vào _MACHITIETHOADON, không mở hay đóng Connection. khong co Transaction
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
        private HOADONXUATKHOCHITIET GetHOADONXUATKHOCHITIET_NoOpenConnection(IDbConnection con,string MACHITIETHOADON)
        {
			HOADONXUATKHOCHITIET obj = null;
			try
			{
            	HOADONXUATKHOCHITIETDao DAO = new HOADONXUATKHOCHITIETDao(con);
            	obj = DAO.SelectByKey(MACHITIETHOADON);
			}
			catch
			{
				throw new Exception("Không tìm thấy HOADONXUATKHOCHITIET.");
				obj = null;
			}
			return obj;
        }
		
		/// <summary>
        /// Lấy HOADONXUATKHOCHITIET dựa vào _MACHITIETHOADON, không mở hay đóng Connection. co Transaction
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
		private HOADONXUATKHOCHITIET GetHOADONXUATKHOCHITIET_NoOpenConnection(IDbConnection con,string MACHITIETHOADON, IDbTransaction trans)
        {
			HOADONXUATKHOCHITIET obj = null;
			try
			{
            	HOADONXUATKHOCHITIETDao DAO = new HOADONXUATKHOCHITIETDao(con);
            	obj = DAO.SelectByKey(MACHITIETHOADON, trans);
			}
			catch
			{
				throw new Exception("Không tìm thấy HOADONXUATKHOCHITIET.");
				obj = null;
			}
			return obj;
        }
		#endregion
		
		#region /////////////////////////////////Load Cau Lenh SQL Command //////////////////////////////////////
        //--------------------------------------Load List---------------------------------------------------------
         private bool loadList(IDbConnection con, string commandtext)
         {
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				
                trans = con.BeginTransaction();
				HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                dao.LoadByCommandText(commandtext, trans);
                trans.Commit();
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;	
        }	
		//----------------------------------Thao Tac Theo Command Text---------------------------------------
        public bool Cmd_LoadByCommandText(string commandtext)
        {
			bool bKQ = false;
			bKQ = loadList(dbConnection, commandtext);
			if(bKQ) _ErrMsg ="LoadByCommandText  thành công!";
			else  _ErrMsg ="LoadByCommandText  thất bại!";    
			return bKQ;
        }
		#endregion
		
        #region ////////////////////////Thao tác Insert, Update, Delete khong có transaction/////////////////////
        //-------------------------------------Insert_Update-----------------------------------------------------
        private bool Insert_Update(IDbConnection con, HOADONXUATKHOCHITIET obj, bool isInsert)
        {
            HOADONXUATKHOCHITIET obj2 = null;
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONXUATKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON);
				}
				catch{ obj2 = null; }

                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                trans = con.BeginTransaction();
                ///Nếu Insert
                if (isInsert)
                {
                    if (obj2 != null) { throw new Exception("HOADONXUATKHOCHITIET này đã tồn tại"); }
					{
                    	dao.Insert(obj, trans);
					}
                }
                ///Nếu Update
                else
                {
                    if (obj2 == null) { throw new Exception("HOADONXUATKHOCHITIET này không tồn tại"); }
					{
                    	dao.Update(obj, trans);
					}
                }
                trans.Commit();
                res = true;
			}
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;
        }

        //----------------------------------Delete---------------------------------
        private bool Delete(IDbConnection con, HOADONXUATKHOCHITIET obj)
        {
            HOADONXUATKHOCHITIET obj2 = null;
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONXUATKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON);
				}
				catch{ obj2 = null; }

                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                trans = con.BeginTransaction();
               	if (obj2 == null) { throw new Exception("HOADONXUATKHOCHITIET này không tồn tại"); }
                      dao.Delete(obj, trans);
                trans.Commit();
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;
        }

        //----------------------------------------Thêm------------------------------------------------------------
        /// <summary>
        /// Thêm HOADONXUATKHOCHITIET mới, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_ThemHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, obj, true);
			if(bKQ) _ErrMsg ="Thêm HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Thêm HOADONXUATKHOCHITIET thất bại!";    
            return bKQ; 
        }

        //---------------------------------------------Cập Nhật--------------------------------------------------
        /// <summary>
        /// Cập nhật HOADONXUATKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_CapNhatHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, obj, false);
			if(bKQ) _ErrMsg ="Cập nhật HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Cập nhật HOADONXUATKHOCHITIET thất bại!";    
            return bKQ;
        }
        //-------------------------------------------Xóa-------------------------------------------------
        /// <summary>
        /// Xóa HOADONXUATKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_XoaHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Delete(dbConnection, obj);
			if(bKQ) _ErrMsg ="Xóa HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Xóa HOADONXUATKHOCHITIET thất bại!";    
            return bKQ;
        }
		#endregion
		
		#region ///////////////////////////////Tim Kiem////////////////////////////////////////////////////////
        //----------------------------------Tìm Kiếm List Theo Điều Kiện---------------------------------------
        /// <summary>
        /// Tìm Kiếm  HOADONXUATKHOCHITIET, dựa vào ConditionForm
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public HOADONXUATKHOCHITIETList SearchListByCondition(HOADONXUATKHOCHITIETConditionForm form)
        {
            IDbConnection con = dbConnection;
            try { if (con.State != ConnectionState.Open)  con.Open();  }
            catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
            HOADONXUATKHOCHITIETList list = null;
            try
            {
                if (con.State != ConnectionState.Open)  con.Open(); 
                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                list = dao.SelectByCondition(form);
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) con.Close(); 
            }
            return list;
        }
        //----------------------------------Tìm Kiếm Object Theo Điều Kiện---------------------------------------
        /// <summary>
        /// Tìm Kiếm  HOADONXUATKHOCHITIET, dựa vào ConditionForm
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public HOADONXUATKHOCHITIET SearchObjectByCondition(HOADONXUATKHOCHITIETConditionForm form)
        {
            IDbConnection con = dbConnection;
            try { if (con.State != ConnectionState.Open)  con.Open();  }
            catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
            HOADONXUATKHOCHITIETList list = null;
            try
            {
                if (con.State != ConnectionState.Open)  con.Open(); 
                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                list = dao.SelectByCondition(form);
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) con.Close(); 
            }
            return list[0];
        }
		#endregion
		
        #region ///////////////////Thao tác Insert, Update, Delete có transaction////////////////////////////
        private bool Insert_Update(IDbConnection con,  IDbTransaction trans, HOADONXUATKHOCHITIET obj, bool isInsert)
        {
            HOADONXUATKHOCHITIET obj2 = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONXUATKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON, trans);
				}
				catch{ obj2 = null; }

                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                ///Nếu Insert
                if (isInsert)
                {
                    if (obj2 != null) { throw new Exception("HOADONXUATKHOCHITIET này đã tồn tại"); }
					{
                    	dao.Insert(obj, trans);
					}
                }
                ///Nếu Update
                else
                {
                    if (obj2 == null) { throw new Exception("HOADONXUATKHOCHITIET này không tồn tại"); }
					{
                    	dao.Update(obj, trans);
					}
                }
                res = true;
			}
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				res = false;
            }
            return res;
        }

        //----------------------------------Delete---------------------------------
        private bool Delete(IDbConnection con,  IDbTransaction trans, HOADONXUATKHOCHITIET obj)
        {
            HOADONXUATKHOCHITIET obj2 = null;

            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONXUATKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON, trans);
				}
				catch{ obj2 = null; }

                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
               	if (obj2 == null) { throw new Exception("HOADONXUATKHOCHITIET này không tồn tại"); }
                dao.Delete(obj, trans);
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
                res = false;
            }
            return res;
        }
		
        //----------------------------------------Thêm------------------------------------------------------------
        /// <summary>
        /// Thêm HOADONXUATKHOCHITIET mới, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
		/// <param name="IDbTransaction"></param>
        /// <returns></returns>
        public bool Cmd_ThemHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, trans, obj, true);
			if(bKQ) _ErrMsg ="Thêm HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Thêm HOADONXUATKHOCHITIET thất bại!";    
            return bKQ; 
        }

        //---------------------------------------------Cập Nhật--------------------------------------------------
        /// <summary>
        /// Cập nhật HOADONXUATKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_CapNhatHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, trans, obj, false);
			if(bKQ) _ErrMsg ="Cập nhật HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Cập nhật HOADONXUATKHOCHITIET thất bại!";    
            return bKQ;
        }
        //-------------------------------------------Xóa-------------------------------------------------
        /// <summary>
        /// Xóa HOADONXUATKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONXUATKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_XoaHOADONXUATKHOCHITIET(HOADONXUATKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Delete(dbConnection, trans, obj);
			if(bKQ) _ErrMsg ="Xóa HOADONXUATKHOCHITIET thành công!";
			else  _ErrMsg ="Xóa HOADONXUATKHOCHITIET thất bại!";    
            return bKQ;
        }

        //-------------------------------------------Inert Bang HOA DON NHAP KHO CHI TIET TU BANG  TAM-------------------------------------------------
        /// <summary>
        /// Inert Bang HOA DON NHAP KHO CHI TIET  TU BANG  TAM
        /// </summary>
        /// <param name="HOADONNHAPKHO"></param>
        /// <returns></returns>
        private bool SAOCHEP_HOADONXUATCHITIET(IDbConnection con, IDbTransaction trans, string MAHOADONXUAT)
        {
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                HOADONXUATKHOCHITIETDao dao = new HOADONXUATKHOCHITIETDao(con);
                dao.CopyDataHOADONXUATKHOCHITIET(MAHOADONXUAT, trans);
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
                res = false;
            }
            return res;
        }
        //----------------------------------------Copy Data To HOADONXUATKHOCHITIET------------------------------------------------------------
        /// <summary>
        /// Inert Bang HOA DON XUAT KHO TU BANG TAM
        /// </summary>
        /// <param name="HOADONNHAPKHO"></param>
        /// <returns></returns>
        public bool Cmd_CopyHOADONXUATCHIETTIET(string MAHOADONXUAT, IDbTransaction trans)
        {
            bool bKQ = false;
            bKQ = SAOCHEP_HOADONXUATCHITIET(dbConnection, trans, MAHOADONXUAT);
            if (bKQ) _ErrMsg = "Sao chép HOADONXUATCHIETTIET thành công!";
            else _ErrMsg = "Sao chép  HOADONXUATCHIETTIET thất bại!";
            return bKQ;
        }
		#endregion
    }
}